home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / tex / nghelp.zip / WINDOW.PAS < prev    next >
Pascal/Delphi Source File  |  1992-07-02  |  10KB  |  449 lines

  1. {$A+,B-,E+,F-,I+,N-,O-,R-,V-}
  2. {$UNDEF DEBUG}
  3. {$IFDEF DEBUG} {$D+,L+,S+} {$ELSE} {$D-,L-,S-} {$ENDIF}
  4. Unit Window;
  5.  
  6. Interface
  7.  
  8. Uses YNSystem,YNCrt,FastScr,StrInt;
  9.  
  10. Const MaxButton = 2;
  11.  
  12. Type LargeArray     = Array [1..32000] of Word;
  13.  
  14.      SaveScrPtr     = ^SaveScrRec;
  15.      SaveScrRec     = Record
  16.       X1,Y1,X2,Y2  : Byte;
  17.       ScreenSize   : Word;
  18.       SavedScr     : LargeArray;
  19.      End;
  20.  
  21.      WindowOBJ      = Object
  22.       vOpen         : Boolean;
  23.       sWindowCoord  : WindowCoord; {From previous window}
  24.       sWindMin,
  25.       sWindMax      : Word;
  26.       vBuffer       : SaveScrPtr;  {Buffer of saved screen}
  27.       vWindowCoord  : WindowCoord;
  28.       vRows,vCols   : Byte;
  29.       vTitle        : StrScreen; {Eventuele boder message}
  30.       vStyle        : BorderTypes; {Style of border}
  31.       vColor        : Byte; {Window color}
  32.  
  33.       Constructor Init;
  34.       Procedure   SetColor(Color : Byte);
  35.       Procedure   SetSize(Rows,Cols : Byte;Style : BorderTypes);
  36.       Procedure   SetTitle(Title : StrScreen);
  37.       Procedure   ShowWindow(X,Y : Byte);
  38.       Procedure   CloseWindow;
  39.       Destructor  Done;
  40.      End;
  41.  
  42.  
  43.      MessageStrPtr  = ^StrRec;
  44.      StrRec         = Record
  45.       NextPtr   : MessageStrPtr;
  46.       StrMes    : StrScreen;
  47.      End;
  48.  
  49.      MessageOBJ     = Object
  50.       vTotalStr     : Word;
  51.       vFirstPtr     : MessageStrPtr;
  52.       vMesWindow    : WindowOBJ;
  53.       vMesColor     : Byte; {Color of text}
  54.       vIndent       : Byte; {spaces at beginning and end}
  55.  
  56.       Constructor Init;
  57.       Procedure   SetVars(IndentLvl,Color1 : Byte);
  58.       Procedure   AddTitle(St : StrScreen);
  59.       Procedure   AddLine(St : StrScreen);
  60.       Function    Line(Nr : Word) : String;
  61.       Procedure   ShowMessage;
  62.       Destructor  Done;
  63.      End;
  64.  
  65.      ButtonRec      = String[10];
  66.  
  67.      AskOBJ         = Object(MessageOBJ)
  68.       vButton       : Array [1..MaxButton] of ButtonRec;
  69.       vActiveButton,        {Aktieve button}
  70.       vTotalButtons,        {number of buttons}
  71.       vHColor,              {Highlighted color}
  72.       vNColor       : Byte; {Normal color}
  73.  
  74.       Constructor Init;
  75.       Procedure   AddButton(Bt : Str12);
  76.       Procedure   DisplayButton;
  77.       Procedure   Go(Var ExitChar : Char);
  78.       Function    ButtonNum : Byte;
  79.       Destructor  Done;
  80.      End;
  81.  
  82.  
  83. Function  SavePartScreen(X1,Y1,X2,Y2 : Byte) : SaveScrPtr;
  84. Procedure RestorePartScreen(Var ScrPtr : SaveScrPtr);
  85. Procedure DisposePartScreen(Var ScrPtr : SaveScrPtr);
  86.  
  87.  
  88. Implementation
  89.  
  90.  
  91. (*------- Code to save and restore screen. Needs YNCrt to function. -------*)
  92.  
  93. Function CalcSizeScreen(X1,Y1,X2,Y2 : Byte) : Word;
  94. Begin
  95.  CalcSizeScreen := ((X2-(X1-1))*(Y2-(Y1-1)))*2 + 6;
  96. End;
  97.  
  98.  
  99. Function SavePartScreen(X1,Y1,X2,Y2 : Byte) : SaveScrPtr;
  100. Var TempScrPtr : SaveScrPtr;
  101.     Loop,
  102.     Count,
  103.     TempSize,
  104.     LenLine,
  105.     Offset     : Word;
  106. Begin
  107.  TempSize := CalcSizeScreen(X1,Y1,X2,Y2);
  108.  if TempSize>MaxAvail then
  109.   Begin
  110.    SavePartScreen := Nil;
  111.    Exit;
  112.   End;
  113.  
  114.  GetMem(TempScrPtr,TempSize);
  115.  TempScrPtr^.X1 := Pred(X1); TempScrPtr^.Y1 := Y1;
  116.  TempScrPtr^.X2 := X2;       TempScrPtr^.Y2 := Y2;
  117.  With TempScrPtr^ Do
  118.   Begin
  119.    ScreenSize := TempSize;
  120.    Count      := 1;
  121.    LenLine    := X2-X1;
  122.    For Loop := Y1 to Y2 Do
  123.     Begin
  124.      OffSet := VideoOfs + (X1*2) + (MaxCols*2*(Loop-1));
  125.      MoveFromScreen(Mem[VideoSeg:OffSet],SavedScr[Count],LenLine);
  126.      Inc(Count,LenLine);
  127.     End;
  128.   End;
  129.  SavePartScreen := TempScrPtr;
  130. End;
  131.  
  132.  
  133. Procedure RestorePartScreen(Var ScrPtr : SaveScrPtr);
  134. Var Loop     : Byte;
  135.     LenLine,
  136.     Count,
  137.     Offset   : Word;
  138. Begin
  139.  if ScrPtr=Nil then Exit;
  140.  
  141.  With ScrPtr^ Do
  142.   Begin
  143.    Count   := 1;
  144.    LenLine := X2-X1;
  145.    For Loop := Y1 to Y2 Do
  146.     Begin
  147.      OffSet := VideoOfs + (X1*2)+(MaxCols*2*(Loop-1));
  148.      MoveToScreen(SavedScr[Count],Mem[VideoSeg:OffSet],LenLine);
  149.      Count := Count + LenLine; {*2 voor attr}
  150.     End;
  151.   End;
  152. End;
  153.  
  154.  
  155. Procedure DisposePartScreen(Var ScrPtr : SaveScrPtr);
  156. Begin
  157.  if ScrPtr=Nil then Exit;
  158.  
  159.  FreeMem(ScrPtr,ScrPtr^.ScreenSize);
  160.  ScrPtr := Nil;
  161. End;
  162.  
  163. (*---------------- End Code to save and restore screen. -------------------*)
  164.  
  165. Constructor WindowOBJ.Init;
  166. Begin
  167.  vOpen           := False;
  168.  vWindowCoord.X1 := 10;
  169.  vWindowCoord.Y1 := 5;
  170.  vWindowCoord.X2 := 70;
  171.  vWindowCoord.Y2 := 20;
  172.  vStyle          := SingleBrdr;
  173.  vTitle          := '';
  174.  sWindowCoord    := Screen.vWindow;
  175.  sWindMax        := YNCrt.WindMax;
  176.  sWindMin        := YNCrt.WindMin;
  177.  vColor          := White+CyanBG;
  178.  vBuffer         := Nil;
  179. End;
  180.  
  181. Procedure WindowOBJ.SetColor(Color : Byte);
  182. Begin
  183.  vColor := Color;
  184. End;
  185.  
  186. Procedure WindowOBJ.SetSize(Rows,Cols : Byte;Style : BorderTypes);
  187. Begin
  188.  vRows  := Rows;
  189.  vCols  := Cols;
  190.  vStyle := Style;
  191. End;
  192.  
  193. Procedure WindowOBJ.SetTitle(Title : StrScreen);
  194. Begin
  195.  vTitle := Title;
  196. End;
  197.  
  198. Procedure WindowOBJ.ShowWindow(X,Y : Byte);
  199. Begin
  200.  vOpen := True;
  201.  With vWindowCoord Do
  202.   Begin
  203.    X1 := X;
  204.    Y1 := Y;
  205.    X2 := Succ(X+vCols);
  206.    Y2 := Succ(Y+vRows);
  207.    if vBuffer=Nil then vBuffer := SavePartScreen(X1,Y1,X2,Y2);
  208.    Screen.BoxEngine(X1,Y1,X2,Y2,vColor,vStyle,True);
  209.    Screen.TitleEngine(X1,Y1,X2,Y2,vTitle);
  210.  
  211.    if vStyle=NoBrdr then
  212.     Screen.SetWindow(X1,Y1,X2,Y2)
  213.     Else Screen.SetWindow(Succ(X1),Succ(Y1),Pred(X2),Pred(Y2));
  214.   End;
  215.  
  216. End;
  217.  
  218.  
  219. Procedure WindowOBJ.CloseWindow;
  220. Begin
  221.  if vOpen then
  222.   Begin
  223.    RestorePartScreen(vBuffer);
  224.    Screen.vWindow := sWindowCoord;
  225.    YNCrt.WindMax  := sWindMax;
  226.    YNCrt.WindMin  := sWindMin;
  227.   End;
  228.  vOpen := False;
  229. End;
  230.  
  231. Destructor WindowOBJ.Done;
  232. Begin
  233.  CloseWindow;
  234.  DisposePartScreen(vBuffer);
  235. End;
  236.  
  237. (*--------------------------------------------------------------------------*)
  238.  
  239. Constructor MessageOBJ.Init;
  240. Begin
  241.  vMesWindow.Init;
  242.  vTotalStr := 0;
  243.  vFirstPtr := Nil;
  244.  vMesColor := White+CyanBG;
  245.  vIndent   := 1;
  246. End;
  247.  
  248. Procedure MessageOBJ.SetVars(IndentLvl,Color1 : Byte);
  249. Begin
  250.  vIndent   := IndentLvl;
  251.  vMesColor := Color1;
  252. End;
  253.  
  254. Procedure MessageOBJ.AddTitle(St : StrScreen);
  255. Begin
  256.  vMesWindow.SetTitle(St);
  257. End;
  258.  
  259. Procedure MessageOBJ.AddLine(St : StrScreen);
  260.  
  261.   Function LastPtr : MessageStrPtr;
  262.   Var P : MessageStrPtr;
  263.   Begin
  264.    P := vFirstPtr;
  265.    While P^.NextPtr<>Nil Do P := P^.NextPtr;
  266.    LastPtr := P;
  267.   End;
  268.  
  269. Var P : MessageStrPtr;
  270. Begin
  271.  if vTotalStr>=MaxRows-2 then Exit;
  272.  if MaxAvail<5+Length(St) then Exit;
  273.  
  274.  if vFirstPtr=Nil then
  275.   Begin
  276.    GetMem(vFirstPtr,5+Length(St));
  277.    vFirstPtr^.NextPtr := Nil;
  278.    vFirstPtr^.StrMes  := St;
  279.   End Else Begin
  280.             P := LastPtr;
  281.             GetMem(P^.NextPtr,5+Length(St));
  282.             P := P^.NextPtr;
  283.             P^.NextPtr := Nil;
  284.             P^.StrMes  := St;
  285.            End;
  286.  Inc(vTotalStr);
  287. End;
  288.  
  289. Function MessageOBJ.Line(Nr : Word) : String;
  290. Var Loop : Byte;
  291.     P    : MessageStrPtr;
  292. Begin
  293.  P := vFirstPtr;
  294.  For Loop := 2 to Nr Do
  295.   Begin
  296.    P := P^.NextPtr;
  297.   End;
  298.  
  299.  if P=Nil then Line := ''
  300.   Else Line := P^.StrMes;
  301. End;
  302.  
  303. Procedure MessageOBJ.ShowMessage;
  304.  
  305.   Function MaxLength : Byte;
  306.   Var P : MessageStrPtr;
  307.       L : Byte;
  308.   Begin
  309.    P := vFirstPtr;
  310.    L := Length(vFirstPtr^.StrMes);
  311.    While P^.NextPtr<>Nil Do
  312.     Begin
  313.      P := P^.NextPtr;
  314.      if Length(P^.StrMes)>L then L := Length(P^.StrMes);
  315.     End;
  316.    L := L + vIndent*2;
  317.    if L>MaxCols-2 then L := MaxCols-2;
  318.    MaxLength := L;
  319.   End;
  320.  
  321. Var Len,
  322.     R,C,
  323.     Loop       : Byte;
  324.     S          : StrScreen;
  325. Begin
  326.  if vTotalStr=0 then Exit;
  327.  
  328.  Len := MaxLength;
  329.  
  330.  With vMesWindow Do
  331.   Begin
  332.    SetSize(vTotalStr,Len,DoubleBrdr);
  333.    SetColor(vColor);
  334.    R := (MaxRows-vTotalStr) Div 2;
  335.    C := (MaxCols-Len) Div 2;
  336.    ShowWindow(C,R);
  337.  
  338.    For Loop := 1 to vTotalStr Do With Screen Do
  339.     Begin
  340.      S := Line(Loop);
  341.      Case S[1] of
  342.       '^' : Begin
  343.              Delete(S,1,1);
  344.              WriteCenter(Loop,vColor,S);
  345.             End;
  346.       Else FastWrite(1+vIndent,Loop,vColor,S);
  347.      End;{case}
  348.     End;
  349.   End;
  350. End;
  351.  
  352. Destructor MessageOBJ.Done;
  353. Var P,P2 : Message